﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Security.Cryptography;
using System.Text;
using System.Threading.Tasks;

namespace XLB.ExtensionMethod
{
    /// <summary>
    /// md5加密帮助类
    /// </summary>
    public static class MD5Helper
    {
        #region MD5加密
        /// <summary>
        /// 加密字符串
        /// </summary>        
        /// <remarks>64位加密时不需要指定字符串是否小写</remarks>
        /// <param name="message">需要加密的字符串</param>
        /// <param name="codeLength">加密位数(32、16位、64),默认32位</param>
        /// <param name="WhetherLower">是否小写</param>
        /// <returns>加密后的字符串</returns>
        public static string ToMD5(this string message, int codeLength = 32, bool WhetherLower = false)
        {
            if (string.IsNullOrEmpty(message.Trim()))
            {
                return "";
            }
            string result = string.Empty;
            if (!string.IsNullOrEmpty(message))
            {
                switch (codeLength)
                {
                    case 16:
                        result = WhetherLower ? MD5Encryption16(message).ToLower() : MD5Encryption16(message);
                        break;
                    case 32:
                        result = WhetherLower ? MD5Encryption32(message).ToLower() : MD5Encryption32(message);
                        break;
                    case 64:
                        result = MD5Encryption64(message);
                        break;
                    default:
                        result = WhetherLower ? MD5Encryption32(message).ToLower() : MD5Encryption32(message);
                        break;
                }
            }
            return result;
        }

        /// <summary>
        /// 64位加密
        /// </summary>
        /// <param name="message">需要加密的字符串</param>
        /// <returns></returns>
        private static string MD5Encryption64(string message)
        {
            if (string.IsNullOrEmpty(message.Trim()))
            {
                return "";
            }
            MD5 md5 = MD5.Create(); //实例化一个md5对像
                                    // 加密后是一个字节类型的数组，这里要注意编码UTF8/Unicode等的选择　
            byte[] s = md5.ComputeHash(Encoding.UTF8.GetBytes(message));
            return Convert.ToBase64String(s);
        }

        /// <summary>
        /// 32位加密
        /// </summary>
        /// <param name="message">需要加密的字符串</param>
        /// <returns></returns>
        private static string MD5Encryption32(string message)
        {
            if (string.IsNullOrEmpty(message.Trim()))
            {
                return "";
            }
            string pwd = "";
            MD5 md5 = MD5.Create(); //实例化一个md5对像
                                    // 加密后是一个字节类型的数组，这里要注意编码UTF8/Unicode等的选择　
            byte[] s = md5.ComputeHash(Encoding.UTF8.GetBytes(message));
            // 通过使用循环，将字节类型的数组转换为字符串，此字符串是常规字符格式化所得
            for (int i = 0; i < s.Length; i++)
            {
                // 将得到的字符串使用十六进制类型格式。格式后的字符是小写的字母，如果使用大写（X）则格式后的字符是大写字符 
                pwd = pwd + s[i].ToString("X");
            }
            return pwd;
        }

        /// <summary>
        /// 16位加密
        /// </summary>
        /// <param name="message">需要加密的字符串</param>
        /// <returns></returns>
        private static string MD5Encryption16(string message)
        {
            if (string.IsNullOrEmpty(message.Trim()))
            {
                return "";
            }
            var md5 = new MD5CryptoServiceProvider();
            string t2 = BitConverter.ToString(md5.ComputeHash(Encoding.Default.GetBytes(message)), 4, 8);
            t2 = t2.Replace("-", "");
            return t2;
        }
        #endregion
    }
}
